/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkg1ifxArchivos;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
//import pkg1ifxArchivos.cifxLogs;

/**
 * manipular archivo de configuracion en formato
 * #Comentario
 * #
 * parametro=valor
 * parametro2=1,2,3,n
 * @author strailaparicio
 */
public class cifxConfig {
    
    private String spath="ifxconfig.conf";
    private String[] sparametros= new String[0];
    private cifxLogs olog = new cifxLogs();
    private boolean bparamOK=false;
    private String sENTER= System.getProperty("line.separator");
    
    public cifxConfig(String spathsrchivo,cifxLogs odato)
    {
        if(spathsrchivo.length()>0)
            spath=spathsrchivo;
        
        olog = odato;
        //olog.setSalConsola(true);
        //olog.setSalLog(true);
        
        bparamOK=bleerArchCargaPrtros();
    }
    public cifxConfig()
    {
        olog.setSalConsola(true);
        olog.setSalLog(true);
        
        bparamOK=bleerArchCargaPrtros();
    }
    public boolean getparamOK()
    {
        return bparamOK;
    }
    /**
     * FUncion que guarda la informacion del archivo que esta manejando
     * con esta funcion se toma la informacion que esta en el arreglo y se guarda
     * en el archivo que se indica en el destino.
     * @param destino , archivo donde sera guardada la informaicion.
     */
    public void GuardarArchivo(String destino)
    {
        OutputStream out = null;
        try {
            File fstream = new File(destino);
            out = new FileOutputStream(fstream);//Graba todo 
            byte[] bdatos;
            for(int i=0;i<sparametros.length;i++)
            {
                bdatos=(sparametros[i]+sENTER).getBytes();
                out.write(bdatos);
                out.flush();
            }
            
            
            
            out.close();
        } catch (FileNotFoundException ex) {
            olog.outMensaje("cifxConfig.GuardarArchivo: ERROR FileNotFoundException: "+ex.toString());
        } catch (IOException ex) {
            olog.outMensaje("cifxConfig.GuardarArchivo: ERROR IOException: "+ex.toString());
        }
    }
    public void GuardarArchivo()
    {
        OutputStream out = null;
        try {
            File fstream = new File(spath);
            out = new FileOutputStream(fstream);//Graba todo 
            byte[] bdatos;
            for(int i=0;i<sparametros.length;i++)
            {
                bdatos=(sparametros[i]+sENTER).getBytes();
                out.write(bdatos);
                out.flush();
            }
            out.close();
            
        } catch (FileNotFoundException ex) {
            olog.outMensaje("cifxConfig.GuardarArchivo: ERROR FileNotFoundException: "+ex.toString());
        } catch (IOException ex) {
            olog.outMensaje("cifxConfig.GuardarArchivo: ERROR IOException: "+ex.toString());
        }
    }
    public String[] getParametros()
    {
        return sparametros;
    }
    private int buscaParemetro(String parametro)
    {
        int i;
        for(i=0; i<sparametros.length;i++)
        {
            if(sparametros[i].contains(parametro))
            {
                
                return i;
                
            }
        } 
        return -1;
    }
    /**
     * Funcion para agregar valor a un parametro
     * en formato PARAMETRO=VALOR
     * @param parametro
     * @param valor 
     */
    public void setParametro(String parametro, String valor)
    {
        int i =buscaParemetro(parametro);
        String stmp="";
        if(i!=-1)
        {
            //stmp=sparametros[i].substring(0, sparametros[i].indexOf("="));
            sparametros[i]=parametro+"="+valor;
        }
        else
            agregaParametro(parametro+"="+valor);
        
    }
    /**
     * En el caso de inicializar el objeto desde un arreglo armado
     * se hace con esta funcion
     * @param parametros, es un arreglo de String[] con 
     *                    la cadena PARAMETRO=VALOR
     */
    public void setParametros(String[] parametros)
    {
        sparametros=parametros;
    }
    public String getPathArchivo()
    {
        return spath;
    }
    public void setPathArchivo(String sdato)
    {
        spath=sdato;
    }
    
    private void agregaParametro(String slinea)
    {
        String[] stmps = new String[sparametros.length];
        System.arraycopy(sparametros, 0, stmps, 0, sparametros.length);
        sparametros=new String[sparametros.length+1];
        System.arraycopy(stmps, 0, sparametros, 0, stmps.length);
        
        if((sparametros.length-1)<0)
        {
            sparametros[0]=slinea;
        }
        else
        {
            sparametros[sparametros.length-1]=slinea;
        }
        
        
    }
    private boolean bleerArchCargaPrtros()
    {
        String slinep="";
        olog.outMensaje("cifxConfig.bleerArchCargaPrtros: Cargando archivo configuracion: "+spath);
        File fconfig = new File(spath);
        try {
            if(fconfig.exists())
            {
                InputStream fin = new FileInputStream(fconfig);
                BufferedReader brin = new BufferedReader(new InputStreamReader(fin));
                
                while((slinep=brin.readLine())!=null)
                {
                    if(slinep.length()>0)
                    {
                        if(!slinep.contains("#"))
                        {
                            agregaParametro(slinep);
                        }
                    }

                }
               
                
            }
            else
            {
               olog.outMensaje("cifxConfig.bleerArchCargaPrtros: ERROR Archivo no existe: "+spath); 
               return false;
            }
            
        } catch (FileNotFoundException ex) {
            //Logger.getLogger(cifxConfig.class.getName()).log(Level.SEVERE, null, ex);
            olog.outMensaje("cifxConfig.bleerArchCargaPrtros: FileNotFoundException ERROR "+ex.toString());
            return false;
        }
        catch (IOException ex) {
            //Logger.getLogger(cifxConfig.class.getName()).log(Level.SEVERE, null, ex);
            olog.outMensaje("cifxConfig.bleerArchCargaPrtros: IOException ERROR "+ex.toString());
            return false;
        }
        
        return true;
        
    }
    public void leerArchCargaPrtros()
    {
        bleerArchCargaPrtros();
        
    }
    public String traeParametro(String sparametro)
    {
        
        for(int i=0; i<sparametros.length;i++)
        {
            if(sparametros[i].contains(sparametro))
            {
                return sparametros[i].substring(sparametros[i].indexOf("=")+1);
                
            }
        }
        
        return ""; 
                
    }
    
    
    
    
}
